/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.*;
import br.jm.acionista.sistema.eao.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpSession;

/**
 *
 * @author joao
 */
public class RelatorioCertificadoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Cliente selectedCliente;
    private Cautela selectedCautela;
    private CautelaAcionista selectedCautelaAcionista;
    private RelatorioCertificado selectedCertificado;
    private RelatorioCertificadoTemp selectedCertificadoTemp;
    private RelatorioCertificadoTemp[] selectedCertificadoCheck;
    private List<RelatorioCertificadoTemp> certificadoList;
    private ClienteEao ClienteJpa;
    private CautelaEao CautelaJpa;
    private CautelaAcionistaEao CautelaAcionistaJpa;
    private RelatorioCertificadoEao relatorioCertificadoJpa;
    private RelatorioCertificadoTempEao relatorioCertificadoTempJpa;
    private EntityManager sessao;
    private FacesMessage msg = null;
    private int impresso;
    private String cSql;
    private EmpresaEao empresaJpa;
    private Empresa selectedEmpresa;
    private FacesContext ctx;
    public HttpSession session;
    private String cPagina;
    private String order = "1";
    private boolean mostra = true;

    public RelatorioCertificadoBean() throws EaoException {
        ClienteJpa = ClienteEao.getInstance();
        CautelaJpa = CautelaEao.getInstance();
        CautelaAcionistaJpa = CautelaAcionistaEao.getInstance();
        relatorioCertificadoJpa = RelatorioCertificadoEao.getInstance();
        relatorioCertificadoTempJpa = RelatorioCertificadoTempEao.getInstance();
        empresaJpa = EmpresaEao.getInstance();

        selectedCliente = new Cliente();
        selectedCautela = new Cautela();
        selectedCautelaAcionista = new CautelaAcionista();
        selectedCertificado = new RelatorioCertificado();
        selectedCertificadoTemp = new RelatorioCertificadoTemp();
        selectedEmpresa = new Empresa();

        cPagina = FacesContext.getCurrentInstance().getViewRoot().getViewId();

        cSql = null;
        if (cPagina.matches(".*relatorioCompCertificado.*")) {
            cSql = "select id_cliente,nom_cliente "
                + "from relatorio_certificado_temp "
                + "union "
                + "( "
                + "select b.id_cliente,a.nom_cliente "
                + "from cliente a, cautela b "
                + "where a.qde_acao > 0 and a.id_cliente = b.id_cliente and a.impresso = 1 "
                + " union "
                + "select b.id_cliente,a.nom_cliente "
                + "from cliente a, cautela_acionista b "
                + "where a.qde_acao > 0 and a.id_cliente = b.id_cliente and a.impresso = 1 "
                + ") "
                + "order by nom_cliente";
            
            impresso = 1;
        } else {
            cSql = "select a.id_cliente,a.nom_cliente "
                + "from cliente a "
                + "where a.qde_acao > 0  "
                + "order by nom_cliente";
            
            impresso = 0;
        }

        certificadoList = relatorioCertificadoTempJpa.getNative("RelatorioCertificadoTemp", 0, relatorioCertificadoJpa.getCount("RelatorioCertificado"), null, true, null, cSql, null);
    }

    public void gerarCertificado(ActionEvent actionEvent) throws EaoException {
        try {
            ctx = FacesContext.getCurrentInstance();
            session = (HttpSession) ctx.getExternalContext().getSession(false);
            session.setAttribute("tabAcionistas", selectedCertificadoCheck);

            selectedEmpresa = new Empresa();
            selectedEmpresa = empresaJpa.getPorId(1);
            BigDecimal nNumCertificado = selectedEmpresa.getNumCertificado();

            this.sessao = relatorioCertificadoJpa.openSessaoLote();
            relatorioCertificadoJpa.openTransaction(this.sessao);

            for (int i = 0; i < selectedCertificadoCheck.length; i++) {
                selectedCliente = new Cliente();
                selectedCertificado = new RelatorioCertificado();
                selectedCertificadoTemp = new RelatorioCertificadoTemp();

                selectedCertificadoTemp = selectedCertificadoCheck[i];

                selectedCliente = ClienteJpa.getPorId(selectedCertificadoTemp.getIdCliente(), "S", this.sessao);

                cSql = "delete from relatorio_certificado where id_cliente = ".concat(selectedCliente.getIdCliente().toString());
                ClienteJpa.executeUpdate(cSql, "S", this.sessao);

                if (selectedCliente.getQdeAcao().compareTo(BigDecimal.ZERO) > 0) {
                    nNumCertificado = nNumCertificado.add(new BigDecimal(1));

                    selectedCertificado.setIdCautela(null);
                    selectedCertificado.setDatCautela(new Date());
                    selectedCertificado.setIdCliente(selectedCliente);
                    selectedCertificado.setNumCertificado(nNumCertificado);
                    relatorioCertificadoJpa.create(selectedCertificado, "S", this.sessao);
                }

                selectedCliente.setImpresso(1);
                ClienteJpa.edit(selectedCliente, "S", this.sessao);
            }

            selectedEmpresa.setNumCertificado(nNumCertificado);
            empresaJpa.edit(selectedEmpresa, "S", this.sessao);

            relatorioCertificadoJpa.closeTransaction(this.sessao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Geração dos Certificados efetuada com Sucesso!", "");
            this.mostra = false;
        } catch (Exception ex) {
            if (this.sessao.isOpen()) {
                relatorioCertificadoJpa.closeSessaoRollback(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Verifique Contacte o Administrador!", "");
            
        } finally {
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void gerarRelatorio(ActionEvent actionEvent) throws EaoException {
        try {
            ctx = FacesContext.getCurrentInstance();
            session = (HttpSession) ctx.getExternalContext().getSession(false);
            session.setAttribute("tabAcionistas", selectedCertificadoCheck);

            for (int i = 0; i < 600000000; i++) {
                String cTeste = "";
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Geração das 2a. Vias dos Certificados efetuada com Sucesso!", "");
            this.mostra = false;
        } catch (Exception ex) {
            Logger.getLogger(RelatorioLivroTransferenciaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void retornaRelatorio(ActionEvent actionEvent) throws EaoException {
        this.mostra = true;
    }

    public List<RelatorioCertificadoTemp> getCertificadoList() {
        return certificadoList;
    }

    public void setCertificadoList(List<RelatorioCertificadoTemp> certificadoList) {
        this.certificadoList = certificadoList;
    }

    public int getImpresso() {
        return impresso;
    }

    public void setImpresso(int impresso) {
        this.impresso = impresso;
    }

    public Cautela getSelectedCautela() {
        return selectedCautela;
    }

    public void setSelectedCautela(Cautela selectedCautela) {
        this.selectedCautela = selectedCautela;
    }

    public CautelaAcionista getSelectedCautelaAcionista() {
        return selectedCautelaAcionista;
    }

    public void setSelectedCautelaAcionista(CautelaAcionista selectedCautelaAcionista) {
        this.selectedCautelaAcionista = selectedCautelaAcionista;
    }

    public RelatorioCertificado getSelectedCertificado() {
        return selectedCertificado;
    }

    public void setSelectedCertificado(RelatorioCertificado selectedCertificado) {
        this.selectedCertificado = selectedCertificado;
    }

    public RelatorioCertificadoTemp[] getSelectedCertificadoCheck() {
        return selectedCertificadoCheck;
    }

    public void setSelectedCertificadoCheck(RelatorioCertificadoTemp[] selectedCertificadoCheck) {
        this.selectedCertificadoCheck = selectedCertificadoCheck;
    }

    public Cliente getSelectedCliente() {
        return selectedCliente;
    }

    public void setSelectedCliente(Cliente selectedCliente) {
        this.selectedCliente = selectedCliente;
    }

    public EntityManager getSessao() {
        return sessao;
    }

    public void setSessao(EntityManager sessao) {
        this.sessao = sessao;
    }

    public RelatorioCertificadoTemp getSelectedCertificadoTemp() {
        return selectedCertificadoTemp;
    }

    public void setSelectedCertificadoTemp(RelatorioCertificadoTemp selectedCertificadoTemp) {
        this.selectedCertificadoTemp = selectedCertificadoTemp;
    }

    public void verificaImpresso(ValueChangeEvent event) throws EaoException {
        String cFiltro = null;

        if (this.impresso == 0) {
            cFiltro = "a.impresso = ".concat(Integer.toString(impresso));
            this.mostra = true;
        } else if (this.impresso == 1) {
            cFiltro = "a.impresso = ".concat(Integer.toString(impresso));
            this.mostra = false;
        }

        cSql = "select id_cliente,nom_cliente "
                + "from relatorio_certificado_temp "
                + "union "
                + "( "
                + "select b.id_cliente,a.nom_cliente "
                + "from cliente a, cautela b "
                + "where a.qde_acao > 0 and a.id_cliente = b.id_cliente and ".concat(cFiltro)
                + " union "
                + "select b.id_cliente,a.nom_cliente "
                + "from cliente a, cautela_acionista b "
                + "where a.qde_acao > 0 and a.id_cliente = b.id_cliente and ".concat(cFiltro)
                + ") "
                + "order by nom_cliente";

        certificadoList = relatorioCertificadoTempJpa.getNative("RelatorioCertificadoTemp", 0, relatorioCertificadoJpa.getCount("RelatorioCertificado"), null, true, null, cSql, null);

        PhaseId phaseId = event.getPhaseId();

        if (phaseId.equals(PhaseId.ANY_PHASE)) {
            event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
            event.queue();
        }
    }

    public String getOrder() {
        return order;
    }

    public void setOrder(String order) {
        this.order = order;
    }

    public boolean isMostra() {
        return mostra;
    }

    public void setMostra(boolean mostra) {
        this.mostra = mostra;
    }
    
    
}
